#pragma once

#include <functional>

// 摇杆按键
class Rocker_Button
{
public:
    using self = Rocker_Button;
    using button_func = std::function<int(void)>;
public:
    Rocker_Button(const button_func& func)
        : _value_middle(0)
        , _value_min(0)
        , _value_max(0)
        , _get_value_func(func)
    {}

    void init(int limit_min, int limit_max)
    {
        // 计算middle
        constexpr int cnt = 100;
        for (int i = 0; i < cnt; ++i)
            _value_middle += _get_value_func();
        _value_middle /= cnt;

        // 选出边界
        int min_range = _value_middle - limit_min;
        int max_range = limit_max -_value_middle;
        int range = min_range < max_range ? min_range : max_range;
        _value_min = _value_middle - range;
        _value_max = _value_middle + range;
    }

    int get_value()
    {
        int value = std::max(std::min(_get_value_func(), _value_max), _value_min);
        // 以10为单位向上对齐
        return (value + 9) / 10 * 10;
    }
public:
    // 遥感按键实际值
    int _value_middle;
    int _value_min;
    int _value_max;

    button_func _get_value_func;
};
